package cn.java.chart;

import java.awt.Font;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis3D;
import org.jfree.chart.axis.NumberAxis3D;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer3D;
import org.jfree.data.category.DefaultCategoryDataset;

public class Bar2Demo {
	
	public static void main(String[] args) {
		//实例化图表区域对象
		DefaultCategoryDataset dataset = new DefaultCategoryDataset() ;
		//向图表区域的数据集合中添加数据
		dataset.addValue(3, "中国", "北京") ;
		dataset.addValue(6, "中国", "深圳") ;
		dataset.addValue(2, "中国", "上海") ;
		
		dataset.addValue(8, "美国", "纽约") ;
		dataset.addValue(10, "美国", "旧金山") ;
		dataset.addValue(7, "美国", "华盛顿") ;
	
	
		JFreeChart chart = ChartFactory.createBarChart3D("用户统计报表（所属单位）", //title-主标题名称
														 "所属单位名称", //categoryAxisLabel-x轴标签的名称
														 "数量",  //valueAxisLabel-y轴标签的名称
														 dataset, //dataset-图表区域对象
														 PlotOrientation.VERTICAL, //orientation-图形的显示形式（水平或垂直）
														 true, //legend-是否显示子标题（true或false）
														 true, //tooltips-是否生成提示（true或false）
														 true) ; //urls-是否生成url链接（true或false）
		//处理图形显示中文乱码问题
		//1、处理主标题乱码
		chart.getTitle().setFont(new Font("宋体", Font.BOLD, 18)) ;
		//2、处理子标题乱码
		chart.getLegend().setItemFont(new Font("宋体", Font.BOLD, 15)) ;
		//3、处理图表区域乱码
		//获取图表区域对象
		CategoryPlot categoryPlot = (CategoryPlot) chart.getPlot() ;
		//获取x轴对象
		CategoryAxis3D categoryAxis3D = (CategoryAxis3D) categoryPlot.getDomainAxis() ;
		//获取y轴对象
		NumberAxis3D numberAxis3D = (NumberAxis3D) categoryPlot.getRangeAxis() ;
		//3.1、处理x轴上的乱码
		categoryAxis3D.setTickLabelFont(new Font("宋体", Font.BOLD, 15)) ;
		//3.2、处理x轴外的乱码
		categoryAxis3D.setLabelFont(new Font("宋体", Font.BOLD, 15)) ;
		//3.3、处理y轴上的乱码
		numberAxis3D.setTickLabelFont(new Font("宋体", Font.BOLD, 15)) ;
		//3.4、处理y轴外的乱码
		numberAxis3D.setLabelFont(new Font("宋体", Font.BOLD, 15)) ;
		
		//3.4、处理y轴的上显示的刻度，以1位1格
		//将单位格自动分割属性设为false
		numberAxis3D.setAutoTickUnitSelection(false) ;
		//实例化单位格对象，初始化为1位1格
		NumberTickUnit unit = new NumberTickUnit(1) ;
		//为y轴设置单位格属性
		numberAxis3D.setTickUnit(unit) ;
		
		//设置图表区域内绘图区域的显示属性
		//获取绘图区域对象
		BarRenderer3D barRenderer3D = (BarRenderer3D) categoryPlot.getRenderer() ;
		//设置柱的宽度
		barRenderer3D.setMaximumBarWidth(0.07) ;
		//在柱子上显示数据
		barRenderer3D.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator()) ;
		barRenderer3D.setBaseItemLabelsVisible(true) ;
		barRenderer3D.setBaseItemLabelFont(new Font("宋体", Font.BOLD, 15)) ;
		
		//使用ChartFrame对象显示图表
		ChartFrame frame = new ChartFrame("xyz", chart) ;
		//设置可显
		frame.setVisible(true) ;
		//显示图表
		frame.pack() ;
	}

}
